class Cat(object):
    def __init__(self, name):
        """
        初始化方法
        self.属性名 = 属性的初始值
        """
        print("这是类的初始化方法")
        self.name = name

    def __del__(self):
        """
        销毁方法：当对象生命周期结束时（例如：进程结束、函数结束等），调用该方法，一般用于补充内容
        """
        print(f"{self.name}对象被销毁")

    def __str__(self):
        """
        print(对象)时打印的描述信息
        """
        # print(f"对象{self.name}") # 打印错误 print(print(f"对象{self.name}")) 啥都不是
        return f"对象{self.name}"  # 返回字符串，打印正确

    def eat(self):
        print("小猫爱吃鱼")

    def drink(self):
        print("小猫在喝水")


def test_1():
    cat_1 = Cat("Tom")
    cat_1.drink()
    cat_1.eat()

    # cat_1.name = 'Tom'  #不规范的编程，不要在类外面给对象增加属性

    print(cat_1)
    # <__main__.Cat object at 0x00000242FF378FE0> 当类中无__str__方法时，print会打印该对象的类、地址等
    # 类中设置了__str__方法，打印结果：对象Tom

    cat_2 = Cat("加菲猫")
    print(cat_2)

    print(cat_1 is cat_2)  # 打印结果：False,说明同一个类的不同对象的地址不同

    print("程序结束")
    # 程序结束
    # Tom对象被销毁
    # 加菲猫对象被销毁
    # 进一步证明了对象被销毁时会自动执行__del__方法


def test_2():
    cat_1 = Cat("Tom")
    cat_1.drink()
    cat_1.eat()

    print(cat_1)
    # <__main__.Cat object at 0x00000242FF378FE0> 当类中无__str__方法时，print会打印该对象的类、地址等
    # 类中设置了__str__方法，打印结果：对象Tom

    cat_2 = Cat("加菲猫")
    print(cat_2)

    print(cat_1 is cat_2)  # 打印结果：False,说明同一个类的不同对象的地址不同
    del cat_1

    print("程序结束")
    # Tom对象被销毁
    # 程序结束
    # 加菲猫对象被销毁
    # del方法会销毁对象，同时会自动调用__del__方法


def test_3():
    cat_1 = Cat("Tom")
    cat_1.drink()
    cat_1.eat()

    print(cat_1)
    # <__main__.Cat object at 0x00000242FF378FE0> 当类中无__str__方法时，print会打印该对象的类、地址等
    # 类中设置了__str__方法，打印结果：对象Tom

    cat_2 = Cat("加菲猫")
    print(cat_2)
    print(cat_1.name)

    print(cat_1 is cat_2)  # 打印结果：False,说明同一个类的不同对象的地址不同


if __name__ == '__main__':
    # test_1()
    # test_2()

    test_3()
    print("程序结束")
    # Tom对象被销毁
    # 加菲猫对象被销毁
    # 程序结束
    # 函数结束时，函数内所创建的对象全都销毁，所以"....对象被销毁"语句的顺序在前
